package com.ruoyi.web.controller.system;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.MemberCarConstants;
import com.ruoyi.common.core.domain.entity.MemberCar;
import com.ruoyi.common.core.domain.entity.MemberCarPageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.service.IMemberCarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 会员车辆管理控制器
 * web端的会员车辆页面--小程序绑定车辆，一个人最多绑定五个
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/memberCar")
public class MemberCarController extends BaseController {

    @Autowired
    private IMemberCarService memberCarService;



    /**
     *
     * 根据车牌号查询，是否是会员车辆
     */
    @PostMapping("/queryByCarNum")
    public AjaxResult queryByCarNum(@RequestBody MemberCarPageQuery query) {

        return success(memberCarService.queryByCarNum(query.getCarNum()));
    }


    /**
     * 根据会员手机号查询车辆列表
     * 根据会员手机号，查询状态为绑定中的
     */
    @PostMapping("/listByMemberCar")
    public TableDataInfo listByMemberCar(@RequestBody MemberCarPageQuery query) {

        List<MemberCar> list = memberCarService.listByMemberCar(query.getMemberPhone());

        return getDataTable(list);
    }

    /**
     * 分页查询会员车辆列表
     * 根据会员手机号，查询状态为绑定中的
     */
    @PostMapping("/page")
    public TableDataInfo list(@RequestBody MemberCarPageQuery query) {
        // 设置分页参数
        PageUtils.startPage(query.getPageNum(), query.getPageSize());

        // 查询数据
        List<MemberCar> list = memberCarService.selectMemberCarList(query);

        return getDataTable(list);
    }

    /**
     * 导出会员车辆数据
     */
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, MemberCar memberCar) {
//        List<MemberCar> list = memberCarService.selectMemberCarList(memberCar);
//        ExcelUtil<MemberCar> util = new ExcelUtil<>(MemberCar.class);
//        util.exportExcel(response, list, "会员车辆数据");
//    }

    /**
     * 获取会员车辆详细信息
     */
    @GetMapping("/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return success(memberCarService.selectMemberCarById(id));
    }

    /**
     * 新增会员车辆
     * 判断该车牌是否被绑定过
     * 解绑的可以绑定别的用户
     * 车牌不能同时被2个手机号绑定，所以如果是解绑的，就更新用户手机号，禁用状态的不能绑定
     *
     * 如果没出现过，要
     * 根据车牌号查询
     * 还要判断，车辆在car_log表，查询条件为：车牌号、和out_status 是 0   出场状态（0=未出场，1=已出场）
     * 有，就推送一次优惠，否则不推送
     * 都要返回给前端
     *
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody MemberCar memberCar) {
        // 先判断车牌状态
        Integer carStatus = memberCarService.judgeMemberCar(memberCar);

        if (carStatus == MemberCarConstants.CAR_STATUS_BOUND) {
            // 已绑定状态
            return AjaxResult.error(4001, "该车牌已被绑定");
        } else if (carStatus == MemberCarConstants.CAR_STATUS_DISABLED) {
            // 已禁用状态
            return AjaxResult.error(4001, "抱歉，车牌已被禁用，请联系客服！");
        }

        // 调用修改后的insertMemberCar方法
        Map<String, Object> result = memberCarService.insertMemberCar(memberCar, carStatus);

        // 根据返回结果构建响应
        if ((boolean) result.get("success")) {
            // 操作成功，返回用户友好提示
            return AjaxResult.success(result.get("message"));
        } else {
            // 操作失败，返回错误信息
            return AjaxResult.error(result.get("message").toString());
        }
    }

    /**
     * 修改会员车辆
     */
    @PostMapping("/update")
    public AjaxResult edit(@RequestBody MemberCar memberCar) {
        return toAjax(memberCarService.updateMemberCar(memberCar));
    }

    /**
     * 删除会员车辆
     */
    @DeleteMapping("/{id}")
    public AjaxResult remove(@PathVariable Long id) {
        return toAjax(memberCarService.deleteMemberCarById(id));
    }

    /**
     * 批量删除会员车辆
     */
    @DeleteMapping("/deleteBatch")
    public AjaxResult removeBatch(@RequestBody Long[] ids) {
        return toAjax(memberCarService.deleteMemberCarByIds(ids));
    }










    /**
     * 通过前端传递的 code 获取微信 openid
     *
     * @param code 微信登录临时凭证 code
     * @return 包含 openid 的响应结果
     */
    @GetMapping("/login")
    public AjaxResult login(@RequestParam("code") String code) {
        // 参数校验
        if (code == null || code.isEmpty()) {
            return AjaxResult.error("登录凭证不能为空");
        }

        try {
            // 调用微信接口获取 openid
            String result = getWechatOpenid(code);
            System.out.println(result);
            if (result == null) {
                return AjaxResult.error("获取微信用户信息失败");
            }

            // 解析微信返回结果
            JSONObject jsonObject = JSONObject.parseObject(result);

            // 检查是否有错误
            if (jsonObject.containsKey("errcode")) {
                int errcode = jsonObject.getIntValue("errcode");
                String errmsg = jsonObject.getString("errmsg");
//                log.error("获取微信 openid 失败，错误码: {}, 错误信息: {}", errcode, errmsg);
                return AjaxResult.error("微信登录失败: " + errmsg);
            }

            // 获取 openid 和 session_key
            String openid = jsonObject.getString("openid");
            String sessionKey = jsonObject.getString("session_key");

            // 这里可以根据业务需求，将 openid 与用户绑定或创建新用户

            // 返回成功结果，包含 openid
            return AjaxResult.success("登录成功", openid);

        } catch (Exception e) {
//            log.error("微信登录异常", e);
            return AjaxResult.error("微信登录异常，请稍后再试");
        }
    }


    /**
     * 调用微信接口获取 openid
     *
     * @param code 微信登录临时凭证 code
     * @return 微信接口返回结果
     */
    private String getWechatOpenid(String code) {
        // 构建请求 URL
        String url = buildWechatUrl(code);
        System.out.println("请求URL: " + url); // 打印URL用于调试

        // 发送 HTTP 请求
        return HttpUtils.sendGet(url);
    }

    private String buildWechatUrl(String code) {
        // 确保URL模板使用正确的占位符
        String urlTemplate = MemberCarConstants.WECHAT_MINI_SNS_AUTH_CODE2SESSION_URL;


        // 使用String.format进行参数替换
        return String.format(urlTemplate,
                MemberCarConstants.appid,
                MemberCarConstants.secret,
                code);
    }











}
